package com.huanzhidadi.single.thread;

import cn.hutool.core.util.RandomUtil;

public class ExtendsThreadTest {
    public static void main(String[] args) {
        for (int i=0; i<5; i++) {
            MyThreadExtendsThread thread = new MyThreadExtendsThread("线程" + i);
            // 数越大，优先级越高
            // 优先级低的并不代表一定要等到优先级高的运行完才能运行，只是cpu分配的资源少了而已
            // thread.setPriority(i+1);
            /*线程就绪，执行顺序由CPU调用，顺序会发生变化，可以设置执行优先级，这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。
            /通过调用Thread类的 start()方法来启动一个线程，这时此线程处于就绪（可运行）状态，并没有运行，
            一旦得到cpu时间片，就开始执行run()方法，这里方法 run()称为线程体，它包含了要执行的这个线程的内容，
            Run方法运行结束，此线程随即终止。*/
            thread.start();
            // 线程执行，相当于普通方法，没有开启线程，按顺序执行
            // thread.run();

            try {
                // 在每个Thread对象后面使用join方法就可以实现线程的顺序执行
                // 在主线程中调用join()方法，使主线程等待thread终止后再继续执行
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println( "主线程执行完了" );
    }
}

class MyThreadExtendsThread extends Thread {
    public MyThreadExtendsThread(String name) {
        super(name);
    }

    // run方法用来封装执行的代码
    @Override
    public void run() {
        long sleepTime = RandomUtil.randomLong(1000, 3000);
        try {
            Thread.sleep(sleepTime);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(getName() + "休眠" + sleepTime + "ms");
    }
}